import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import re
from collections import Counter

# 设置matplotlib字体，支持中文显示
import matplotlib
matplotlib.rcParams['font.family'] = ['SimHei']  # 黑体

# 第一部分：爬取网页内容
print("正在爬取网页...")
url = 'https://www.scct.cn/jtxxxy/info/1275/2514.htm'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
}

response = requests.get(url=url, headers=headers)
response.encoding = 'utf-8'
html_doc = response.text

# 第二部分：解析网页内容
print("正在解析网页内容...")
soup = BeautifulSoup(html_doc, 'html.parser')
article = soup.find('div', class_='v_news_content')

text_content = ""
if article:
    for p in article.find_all('p'):
        text_content += p.text + "\n"

# 第三部分：简单分词和统计
print("正在进行分词统计...")
# 使用正则表达式从文本中提取所有两字及以上的词语
words = []
# 匹配连续的中文字符
for match in re.finditer(r'[\u4e00-\u9fa5]{2,}', text_content):
    word = match.group()
    # 如果长度为2，直接添加
    if len(word) == 2:
        words.append(word)
    # 如果长度大于2，截取所有可能的2字及以上词语
    else:
        for i in range(len(word)-1):
            # 截取2字词
            words.append(word[i:i+2])
            # 如果还能截取3字词，也添加
            if i+3 <= len(word):
                words.append(word[i:i+3])
            # 如果还能截取4字词，也添加
            if i+4 <= len(word):
                words.append(word[i:i+4])

# 统计词频
word_counter = Counter(words)

# 输出词频统计结果
print("\n词频统计结果（前10个）:")
for word, count in word_counter.most_common(10):
    print(f"{word}: {count}次")

# 保存词频统计结果到文件
with open('word_counts.txt', 'w', encoding='utf-8') as f:
    for word, count in word_counter.most_common():
        f.write(f"{word}: {count}次\n")

# 第四部分：可视化展示
print("正在生成可视化图表...")
# 获取出现频率最高的5个词
top_five = word_counter.most_common(5)
x = [item[0] for item in top_five]
y = [item[1] for item in top_five]

# 创建图形
plt.figure(figsize=(10, 6))
colors = ['#FF9999', '#66B3FF', '#99FF99', '#FFCC99', '#FF99CC']
plt.bar(x, y, color=colors)
plt.xticks(rotation=45)

# 添加标题和标签
plt.title("网页正文中出现频率最高的5个词")
plt.xlabel("词语")
plt.ylabel("出现次数")
plt.tight_layout()

# 在柱子上方显示数值
for i, v in enumerate(y):
    plt.text(i, v + 0.5, str(v), ha='center')

# 保存图表
plt.savefig('word_frequency.png')
print("图表已保存为 word_frequency.png")

# 显示图形(注释此行可能在某些环境中更稳定)
# plt.show() 